package Algorithms.classic;

public class ByteOperate
{

    /**
     *
     * 方法名称：判断是不是奇数
     * 方法描述: <br>
     *
     * @param number    待操作数
     * @return 判断结果
     * <p>创建人：周志辉
     * <p>创建时间：2019/8/20 14:25
     */
    public static boolean isOdd(int number)
    {
        return (number & 1) == 1;
    }

    /**
     *
     * 方法名称：除以2的n次方
     * 方法描述: <br>
     *
     * @param   number  待操作数
     * @param   n       n次方
     * @return  操作结果
     * <p>创建人：周志辉
     * <p>创建时间：2019/8/20 14:25
     */
    public static int divide2(int number, int n)
    {
        return number>>n;
    }

    /**
     *
     * 方法名称：乘以2的n次方
     * 方法描述: <br>
     *
     * @param   number  待操作数
     * @param   n       n次方
     * @return  操作结果
     * <p>创建人：周志辉
     * <p>创建时间：2019/8/20 14:25
     */
    public static int multiply2(int number, int n)
    {
        return number<<n;
    }

    /**
     *
     * 方法名称：判断是不是2的乘方
     * 方法描述: <br>
     *
     * @param   number  待操作数
     * @return  操作结果
     * <p>创建人：周志辉
     * <p>创建时间：2019/8/20 15:00
     */
    public static boolean isPowerOf2_1(int number) {
        return (number & (number - 1)) == 0;
    }

    /**
     *
     * 方法名称：判断是不是2的乘方
     * 方法描述: <br>
     *
     * @param   number  待操作数
     * @return  操作结果
     * <p>创建人：周志辉
     * <p>创建时间：2019/8/20 15:00
     */
    public static boolean isPowerOf2_2(int number) {
        return (number & (-number)) == number;
    }

    /**
     *
     * 方法名称：获取不小于一个数的最小的2的乘方数(HashMap源码里的算法)
     * 方法描述: <br>
     *
     * @param   number  待操作数
     * @return  操作结果
     * <p>创建人：周志辉
     * <p>创建时间：2019/8/20 15:07
     */
    public static int fixNumber2High2(int number) {
        int n = number - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1: n + 1;
    }

    /**
     *
     * 方法名称：获取不大于一个数的最大的2的乘方数(根据HashMap源码里的算法实现)
     * 方法描述: <br>
     *
     * @param   number  待操作数
     * @return  操作结果
     * <p>创建人：周志辉
     * <p>创建时间：2019/8/20 15:07
     */
    public static int fixNumber2Low2(int number) {
        number |= number >>> 1;
        number |= number >>> 2;
        number |= number >>> 4;
        number |= number >>> 8;
        number |= number >>> 16;
        return number - (number >>> 1);
    }

    public static void main(String[] args) {
        int number = 16;
        System.out.println(fixNumber2High2(number));
        System.out.println(fixNumber2Low2(number));
    }
}
